//!
/************************************************************************************************************
 * @file RBGLRenderer.cpp
 ************************************************************************************************************/

/************************************************************************************************************
 * Precompiled Header
 ************************************************************************************************************/
#include "RBGLRendererPCH.h"
 
/************************************************************************************************************
 * Includes
 ************************************************************************************************************/

#include "RBGLRenderer.h"

#define WIN32_LEAN_AND_MEAN
#define WIN32_EXTRA_LEAN

#include "RBMain/RBMemoryManagerOff.h"
#include <Windows.h>
#include <gl/GL.h>
#include "RBMain/RBMemoryManagerOn.h"

/************************************************************************************************************
 * Defines
 ************************************************************************************************************/

/************************************************************************************************************
 * Implementation
 ************************************************************************************************************/

/************************************************************************************************************
 * Constructor
 ************************************************************************************************************/
RBGLRenderer::RBGLRenderer()
: m_Init(0,0,0)
, m_hDC(NULL)
, m_hGLRC(NULL)
{
}

/************************************************************************************************************
 * Destructor
 ************************************************************************************************************/
RBGLRenderer::~RBGLRenderer()
{
}

/**************************************************************************************************************************************************************
 * 
 **************************************************************************************************************************************************************/
bool RBGLRenderer::Init(const RBGLRendererInit& init)
{
    m_Init = init;

    m_fClearZ = -1.0f;

    m_uiClearStencil = 0;

    m_hDC = GetDC((HWND) m_Init.m_pWindowDevice);
    if (!m_hDC)
    {
        return false;
    }
   
    tagPIXELFORMATDESCRIPTOR pfd = 
    {
        sizeof(tagPIXELFORMATDESCRIPTOR),   // Size
        1,                                  // Version
        PFD_SUPPORT_OPENGL |                // Use OpenGL
        PFD_DOUBLEBUFFER |                  // Double buffering
        PFD_DRAW_TO_WINDOW,                 // render to window
        PFD_TYPE_RGBA,                      // Pixel Color Type
        32,                                 // Bit Depth
        0,0,0,0,0,0,                        // Color bits
        0,                                  // no alpha buffer
        0,                                  // shift bit ignored
        0,                                  // no accumulation buffer
        0, 0, 0, 0,                         // accumulation bits ignored
        16,                                 // 16-bit z-buffer
        0,							        // no stencil buffer
        0,                                  // no auxiliary buffer
        PFD_MAIN_PLANE,                     // main layer
        0,                                  // reserved
        0, 0, 0                             // layer masks ignored
    };

    int pixelFormat = ::ChoosePixelFormat((HDC)m_hDC, &pfd);

    ::SetPixelFormat((HDC)m_hDC, pixelFormat, &pfd);

    m_hGLRC = ::wglCreateContext((HDC)m_hDC);
    if (!m_hGLRC)
    {
        DWORD err = GetLastError();
        UNUSED(err);
        return false;
    }

    if (!::wglMakeCurrent((HDC)m_hDC, (HGLRC)m_hGLRC))
    {
        return false;
    }


    return true;

}

/***********************************************************************************************************
 * 
 ***********************************************************************************************************/
void RBGLRenderer::Release()
{
    // Deselect rendering context
    wglMakeCurrent((HDC)m_hDC, (HGLRC)NULL);

    // Destroy rendering context
    wglDeleteContext((HGLRC)m_hGLRC);

    m_hGLRC = NULL;

    m_hDC = NULL;

}

/***********************************************************************************************************
 * 
 ***********************************************************************************************************/
void RBGLRenderer::Swap()
{
    ::SwapBuffers((HDC) m_hDC);
}

/***********************************************************************************************************
 * 
 ***********************************************************************************************************/
void RBGLRenderer::Clear(uint32 uiFlags)
{
    DWORD glFlags = 0;
    if (uiFlags & RBRenderer::CF_COLOR)
    {
        glFlags |= GL_COLOR_BUFFER_BIT;
        glClearColor(m_kClearColor.r, m_kClearColor.g, m_kClearColor.b, m_kClearColor.a);
    }
    if ((uiFlags & RBRenderer::CF_ZBUFFER))
    {
        glFlags |= GL_DEPTH_BUFFER_BIT;
        glClearDepth(m_fClearZ);
    }
    if ((uiFlags & RBRenderer::CF_STENCIL))
    {
        glFlags |= GL_STENCIL_BUFFER_BIT;
        glClearStencil(m_uiClearStencil);
    }

    glClear(glFlags);

}

/**************************************************************************************************************************************************************
 * 
 **************************************************************************************************************************************************************/
void RBGLRenderer::Render(RBGeometry*)
{

}

void RBGLRenderer::UpdateCamera(const RBCamera*)
{

}
/************************************************************************************************************/
